package com.maegul.service;

import com.maegul.data.entities.User;
import com.maegul.service.exception.MaegulException;

/**
 * Interface que modela los servicios basicos que necesita un usuario que accede
 * a la aplicacion
 */
public interface UserService {

	/**
	 * Metodo que se usa para preguntar si un usario existe en la base de datos,
	 * dados un nombre de usuario y una contrasena
	 * 
	 * @param username
	 *            El nombre de usuario
	 * @param password
	 *            La contrasena
	 * @return <code>true</code> si el usuario existe en la base de datos,
	 *         <code>false</code> de lo contrario
	 * @throws MaegulException
	 *             Si hay algun error a la hora de autenticar al usuario: nombre
	 *             de usuario/contrasena han sido modificados en la base de
	 *             datos, base de datos inaccesible, etc
	 */
	boolean authenticate(String username, String password)
			throws MaegulException;

	/**
	 * Metodo que actualiza la contrasena de un usuario, recibe la contrasena
	 * nueva y la antigua para verificar al usuario
	 * 
	 * @param username
	 *            El nombre de usuario
	 * @param oldPassword
	 *            La contrasena antigua
	 * @param newPassword
	 *            La nueva contrasena
	 * @throws MaegulException
	 *             En caso que la contrasena no sea correcta, o que la nueva
	 *             contrasena no se pueda guardar en la base de datos o que la
	 *             base de datos no sea accesible
	 */
	void updatePassword(String username, String oldPassword, String newPassword)
			throws MaegulException;

	/**
	 * Crea un nuevo usuario en la base de datos, dados ciertos parametros
	 * especificados
	 * 
	 * @param username
	 *            el nombre de eusario nuevo
	 * @param password
	 *            la contrasena del usuario
	 * @param mail
	 *            el correo electronico del usuario
	 * @param fullName
	 *            el nombre del usuario
	 * @throws MaegulException
	 *             En caso que no se pueda crear el usuario.
	 */
	void createUser(String username, String password, String mail,
			String fullName) throws MaegulException;

	/**
	 * Elimina a un usaurio de la base de datos, dados un nombre de usuario y
	 * una contrasena para verificar la identidad
	 * 
	 * @param username
	 *            El nombre de usuario
	 * @param password
	 *            La contrasena del usuario
	 * @throws MaegulException
	 *             En caso que no se pueda eliminar el usuario
	 */
	void deleteUser(String username, String password) throws MaegulException;

	/**
	 * Actuializa los datos de un usuario existente, dando el nombre de usuario,
	 * una contrasena valida, y los cambios del usuario
	 * 
	 * @param username
	 *            El nombre de usuario
	 * @param password
	 *            La contrasena del usuario
	 * @param newUser
	 *            La nueva entidad que modela los cambios al usuario
	 * @throws MaegulException
	 *             En caso que no se pueda actualizar el usuario
	 */
	void updateUser(String username, String password, User newUser)
			throws MaegulException;

	/**
	 * Retorna un usaurio dado un nombre de usuario valido
	 * 
	 * @param username
	 *            El nombre de usaurio a bucar
	 * @return El usuario buscado o <code>null</code> de lo contrario
	 */
	User getUser(String username);

}
